#include "../games/globale.h" // Fonction et Headers globaux

#include "../menu/cls_accueil.h" // Classe de gestion du menu principal

/* ----------------------------------------------------
			Constructeur
  ----------------------------------------------------- */
cls_Accueil::cls_Accueil()
{
    debugTrace("Constructeur cls_Accueil");
    this->p_sdlS_Ecran = NULL;
    this->p_sdlS_BtnQuitter = NULL;
}

/* ----------------------------------------------------
			Destructeur
  ----------------------------------------------------- */
cls_Accueil::~cls_Accueil()
{
    debugTrace("Destructeur cls_Accueil");
    this->p_sdlS_Ecran = NULL;
}

/* ----------------------------------------------------
			On charge les différentes objets de l'accueil
  ----------------------------------------------------- */
void cls_Accueil::Init(SDL_Surface* p_sdlS_Ecran)
{
    this->p_sdlS_Ecran = p_sdlS_Ecran;

    // Initialisation des differentes images pour le curseur et sélection d'un curseur
    this->obj_Mouse.fct_InitMouse();
    this->obj_Mouse.fct_SetMouseCursor(MOUSE_CURSOR_ARROW);

    // --------------------
    // LOGO
    // --------------------
    this->p_sdlS_Logo = load_image(join_pathFile(PATH_DATA_IMG_GAME_UI, "LogoAccueil.png"));

    // --------------------
    // BOUTONS
    // --------------------
    this->p_sdlS_BtnJouer = load_image(join_pathFile(PATH_DATA_IMG_GAME_UI, "Jouer.png"));
    this->p_sdlS_BtnContinuer = load_image(join_pathFile(PATH_DATA_IMG_GAME_UI, "Continuer.png"));
    this->p_sdlS_BtnOptions = load_image(join_pathFile(PATH_DATA_IMG_GAME_UI, "Options.png"));
    this->p_sdlS_BtnQuitter = load_image(join_pathFile(PATH_DATA_IMG_GAME_UI, "Quitter.png"));

    this->p_sdlR_positionBtn = (SDL_Rect *)malloc(2 * sizeof (SDL_Rect));
    this->p_sdlR_positionBtn[0].x = 0;
    this->p_sdlR_positionBtn[0].y = 0;
    this->p_sdlR_positionBtn[0].w = CST_BUTTON_MENU_WIDTH;
    this->p_sdlR_positionBtn[0].h = CST_BUTTON_MENU_HEIGHT;
    this->p_sdlR_positionBtn[1].x = CST_BUTTON_MENU_WIDTH;
    this->p_sdlR_positionBtn[1].y = 0;
    this->p_sdlR_positionBtn[1].w = CST_BUTTON_MENU_WIDTH;
    this->p_sdlR_positionBtn[1].h = CST_BUTTON_MENU_HEIGHT;


}

/* ----------------------------------------------------
			Dessine les boutons
  ----------------------------------------------------- */
int cls_Accueil::DrawAccueil(bool b_GameIsRunning, SDL_Event event)
{

    SDL_Rect sdlR_PositionButton_XY;
    int indexSprite;
    int codeRetour=CST_RET_ACCUEIL_RIEN;


    // Affichage du logo en haut à gauche
    SDL_BlitSurface(this->p_sdlS_Logo, NULL, p_sdlS_Ecran, NULL);

    // Determine le cadre du bouton Hauteur/Largeur
    sdlR_PositionButton_XY.h = CST_BUTTON_MENU_HEIGHT;
    sdlR_PositionButton_XY.w = CST_BUTTON_MENU_WIDTH;

    // Détermine la position
    sdlR_PositionButton_XY.x = 650;
    sdlR_PositionButton_XY.y = 350;
    // Verification de l'appartenance à la boite
    if (isInBox(sdlR_PositionButton_XY, event.button.x, event.button.y) == true) {indexSprite = 1; codeRetour = CST_RET_ACCUEIL_PLAY;} else {indexSprite = 0;}
    if (b_GameIsRunning==true)
        SDL_BlitSurface(this->p_sdlS_BtnContinuer, &this->p_sdlR_positionBtn[indexSprite], this->p_sdlS_Ecran, &sdlR_PositionButton_XY);
    else
        SDL_BlitSurface(this->p_sdlS_BtnJouer, &this->p_sdlR_positionBtn[indexSprite], this->p_sdlS_Ecran, &sdlR_PositionButton_XY);

    // Détermine la position
    sdlR_PositionButton_XY.x = 650;
    sdlR_PositionButton_XY.y = 450;
    // Verification de l'appartenance à la boite
    if (isInBox(sdlR_PositionButton_XY, event.button.x, event.button.y) == true) {indexSprite = 1; codeRetour = CST_RET_ACCUEIL_OPTIONS;} else {indexSprite = 0;}
    SDL_BlitSurface(this->p_sdlS_BtnOptions, &this->p_sdlR_positionBtn[indexSprite], this->p_sdlS_Ecran, &sdlR_PositionButton_XY);

    // Détermine la position
    sdlR_PositionButton_XY.x = 650;
    sdlR_PositionButton_XY.y = 550;
    // Verification de l'appartenance à la boite
    if (isInBox(sdlR_PositionButton_XY, event.button.x, event.button.y) == true) {indexSprite = 1; codeRetour = CST_RET_ACCUEIL_QUIT;} else {indexSprite = 0;}
    SDL_BlitSurface(this->p_sdlS_BtnQuitter, &this->p_sdlR_positionBtn[indexSprite], this->p_sdlS_Ecran, &sdlR_PositionButton_XY);

    return codeRetour;
}

/* ----------------------------------------------------
			On lance le menu de l'accueil
  ----------------------------------------------------- */
int cls_Accueil::Run(bool b_GameIsRunning)
{

    SDL_Event sdlS_Event;
    bool b_quit = false;
    int n_CurrentTime;
    int n_CodeRetour=-1;
    int n_RetourDraw;
    bool b_mouseUpActivate = false;

    while (b_quit == false)
    {

        while( SDL_PollEvent( &sdlS_Event ) )
        {

            b_mouseUpActivate=false;

            // Gestion des évènements par l'objet principal, le programme
            switch(sdlS_Event.type)
            {
            //--------------
                case SDL_QUIT:
                    //On quitte le programme
                    b_quit = true;
                    n_CodeRetour=CST_RET_ACCUEIL_QUIT;
                    break;

            //--------------
                case SDL_KEYDOWN: /* Si appui d'une touche */
                    switch (sdlS_Event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: /* Appui sur la touche Echap, */
                            b_quit = true;
                            n_CodeRetour=CST_RET_ACCUEIL_ESC;
                            break;

                        default:
                            break;
                    }
                    break;

            //--------------
                case SDL_MOUSEBUTTONUP:
                    switch (sdlS_Event.button.button)
                    {
                        case SDL_BUTTON_LEFT:
                            b_mouseUpActivate=true;
                            break;
                    }
                    break;
            }

            //Si l'utilisateur ferme la fenêtre avec le X
            if(sdlS_Event.type == SDL_QUIT )
            {
                //On quitte le programme
                b_quit = true;
                n_CodeRetour=CST_RET_ACCUEIL_QUIT;
            }

		}

        // On efface l'ecran
        SDL_FillRect(this->p_sdlS_Ecran, NULL, SDL_MapRGB(this->p_sdlS_Ecran->format, 0, 0, 0));

        // On recupere la valeur de l'instant T
        n_CurrentTime = SDL_GetTicks();


        // On dessine les boutons de l'accueil et on retourne si la valeur si l'on est sur un bouton
        n_RetourDraw = this->DrawAccueil(b_GameIsRunning, sdlS_Event);

        // Si on a cliquer et que l'on a cliqué dessus, on retourne le code du bouton cliqué
        if (b_mouseUpActivate==true && n_RetourDraw != CST_RET_ACCUEIL_RIEN) {b_quit = true; n_CodeRetour = n_RetourDraw;}

        // Et sur le calque le plus élevé, on dessine la souris
        this->obj_Mouse.fct_DrawMouse(this->p_sdlS_Ecran);

        // On met à jour l'affichage (Double duffering)
        SDL_Flip(this->p_sdlS_Ecran);

    }

    return n_CodeRetour;

}


/* ----------------------------------------------------
			On libere les surfaces utilisé lors
			de l'affichage du menu
  ----------------------------------------------------- */
void cls_Accueil::FreeSurface()
{
    // Nettoyage de la memoire
    this->obj_Mouse.fct_FreeSurface();

    // Nettoyage des surfaces
    SDL_FreeSurface(this->p_sdlS_Logo);
    SDL_FreeSurface(this->p_sdlS_BtnJouer);
    SDL_FreeSurface(this->p_sdlS_BtnContinuer);
    SDL_FreeSurface(this->p_sdlS_BtnOptions);
    SDL_FreeSurface(this->p_sdlS_BtnQuitter);

    // Libération des cadres de positionnements de boutons
    free(this->p_sdlR_positionBtn);

}

